package com.wn.demo06;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author yellow Docter
 * @date 2024-07-25
 * @desc 蜗牛创想：www.woniuxy.com
 * <p>
 * 通过 线程池类创线程池
 * AbortPolicy：这是默认的拒绝策略。该策略会抛出一个 RejectedExecutionException 异常。也就对应着“我们系统瘫痪了。
 * CallerRunsPolicy：该策略不会抛出异常，而是会让提交任务的线程（即调用 execute 方法的线程）自己来执行这个任务。也就对应着“谁叫你来办的你找谁去”。
 * DiscardOldestPolicy：策略会丢弃队列中最老的一个任务（即队列中等待最久的任务），然后尝试重新提交被拒绝的任务。也就对应着“看你比较急，去队里加个塞”。
 * DiscardPolicy：策略会默默地丢弃被拒绝的任务，不做任何处理也不抛出异常。也就对应着“今天没办法，不行你看改一天”。
 */
public class Demo23 {

    public static void main(String[] args) {

        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                3,//核心参数
                6,//最大线程数
                0,//线程的空闲时间
                TimeUnit.SECONDS,//时间单位
                new LinkedBlockingQueue<>(3),//等待队列(阻塞队列)
                Executors.defaultThreadFactory(),//线程工厂
                new ThreadPoolExecutor.AbortPolicy() //拒绝策略
        );
        // 启动 2个线程     ThreadPoolExecutor 核心数据是3  直接使用核心线程数就可以解决线程的任务
        // 启动 4个线程     ThreadPoolExecutor 核心数据是3  直接使用核心线程数、多余的一个线程放到阻塞队列中 进行等待
        // 其他的3个线程执行完毕后  从阻塞队列中获取任务 进行执行
        // 启动 8个线程     ThreadPoolExecutor 核心数据是3 阻塞队列是3  8个线程满了  最大线程数开始进行工作 创建线程4\5
        // 启动 14个线程    ThreadPoolExecutor 核心数据是3 阻塞队列是3  最大线程数是6 都满了  拒绝策略  有四个解决方案
        //   默认抛出异常

        for (int i = 0; i < 14; i++) {
            executor.execute(()->{
                Thread thread = Thread.currentThread();
                String name = thread.getName();
                System.out.println("name = " + name);
            });
        }
    }

}
